package pe.gob.foncodes.spp.bs.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import pe.gob.foncodes.spp.bs.domain.Indicador;

@Repository
public class IndicadorDAOImpl extends BaseDAO<Indicador> implements
		IndicadorDAO {

	@Autowired
	public IndicadorDAOImpl(SessionFactory sessionFactory) {
		super(sessionFactory);

	}

	public void guardarIndicador(Indicador indicador) {
		save(indicador);

	}

	public Indicador actualizarIndicador(Indicador indicador) {

		return update(indicador);
	}

	public Indicador buscarIndicadorPorId(Serializable id) {

		return findById(id, Indicador.class);
	}

	public List<Indicador> buscarIndicadores() {
		return findAll(Indicador.class);
	}
	
	public List<Indicador> buscarIndicadoresPorObjetivo(Long nIdObjetivo) {
		StringBuilder sql = new StringBuilder();
		sql.append(" Select a from Indicador a where a.objetivo.nidObjetivo= "
				+ nIdObjetivo);
		return findByQuery(sql);
	}
	
	public List<Indicador> buscarIndicadorPorIdONombreOIdObjetivo(Indicador indicador) {

		DetachedCriteria criteria = DetachedCriteria.forClass(Indicador.class);
		if (indicador != null) {
			if (indicador.getObjetivo().getNidObjetivo()!= null
					&& !indicador.getObjetivo().getNidObjetivo().equals(0L)) {
				criteria.add(Restrictions.eq("objetivo.nidObjetivo",
						indicador.getObjetivo().getNidObjetivo()));
			}

			if (indicador.getTxtIndicador() != null
					&& !"".equals(indicador.getTxtIndicador())) {
				criteria.add(Restrictions.like("txtIndicador",
						"%" + indicador.getTxtIndicador()+ "%"));
			}

			if (indicador.getNidIndicador() != null
					&& !"0".equals(indicador.getNidIndicador()) && indicador.getNidIndicador()!=0) {
				criteria.add(Restrictions.eq("nidIndicador",
						indicador.getNidIndicador()));
			}
		}

		criteria.addOrder(Order.desc("nidIndicador"));

		return findByCriteria(criteria);
	}

}
